# -*- encoding:utf-8 -*-
# 开发团队：大数据组
# 开发者：albert·bing
# 开发时间：2020/7/5 20:13
# 文件名称：far_compute_sec.py
# 开发工具：PyCharm


#  start your code

# import sys
# sys.path.append('/home/hadoop/programs/spider/WTP66_BigdataCrawler')

import os
import numpy as np
from functools import reduce
import itertools
import pandas as pd


def read(dirlen, rootpath, subfiles):
    total_source_list = []
    for i in range(0, dirlen, 1):
        source_far = open(rootpath + subfiles[i], 'r', buffering=1)
        list = source_far.readline()
        total_source_list.append(list)
    return total_source_list


def dircount(paths):
    return len(os.listdir(paths))


def filename(path):
    subfiles = []
    for files in os.walk(path):
        subfiles = files[2]
    return subfiles


def sortData():
    # 总的数据集合
    result = []
    # 循环将所有的文件数据读取进来，然后每一个用户的作为一个子数据集合
    # 第一步读取
    reslut_fir = []
    for j in range(1, 6, 1):
        # 根路径
        rootpath = "E:/KNN1111/FAR/testL01_0" + str(j) + "/"
        # 文件数量
        dirlen = dircount(rootpath)
        # 子文件名称
        subfiles = filename(rootpath)
        # 读取文件数据
        total_source_list = read(dirlen, rootpath, subfiles)
        reslut_fir.append(total_source_list)
    # 第二步 整理数据
    for j in range(0, len(reslut_fir[0]), 1):
        # 一个用户的五张图片
        one_list = []
        one_list.append(reslut_fir[0][j])
        one_list.append(reslut_fir[1][j])
        one_list.append(reslut_fir[2][j])
        one_list.append(reslut_fir[3][j])
        one_list.append(reslut_fir[4][j])

        result.append(one_list)
    return result


def computeMinDistance(pre_list):
    len_num = len(pre_list)
    sum_dis_list = []
    # 第一个用户
    for i in range(0, len_num, 1):
        one_dis_list = []
        # 第二个用户
        # 每次计算完之后的用户便不再重新计算  例如：  a->b,a->c ....  ; b->c,b->d ....
        for j in range(i, len_num, 1):
            if i == j:
                continue
            else:
                one_dis_list.append(computeTwoPersonMinDistance(pre_list[i], pre_list[j]))
        print("第[" + str(i + 1) + "]用户计算完成")
        print(one_dis_list)
        sum_dis_list.append(one_dis_list)
    return sum_dis_list


def computeTwoPersonMinDistance(list_one, list_two):
    # 现将第二个用户的五个数据进行排列组合,并且获取到所有的组合list
    res_two = getPermutationAndCombination(list_two)

    two_list_dis = []
    # 将所有的排列组合的结果与固定的一个用户进行比较
    for i in range(0, len(res_two), 1):
        two_list_dis.append(computeTwoListDistance(list_one, res_two[i]))
    return min(two_list_dis)


# 求两个list的子元素的距离和
def computeTwoListDistance(list_one1, list_two1):
    first_list = []
    for i in range(0, 5, 1):
        first_list.append(computeTwoPointDis(list_one1[i], list_two1[i]))
    return getSumList(first_list)


# 解决排列组合的问题
def getPermutationAndCombination(list_two):
    res = []
    for p in itertools.permutations(list_two):
        res.append(p)
    return res


# 求和一个list的和
def getSumList(list):
    sum = 0
    for i in range(0, len(list), 1):
        sum = sum + list[i]
    return sum


# 计算两个点之间的距离
def computeTwoPointDis(list1, list2):
    ls1 = list(list1)
    ls2 = list(list2)
    n = len(ls1)
    dis = 0
    for k in range(0, n, 1):
        if ls1[k] == ls2[k]:
            dis = dis + 1

    return dis / 1536


if __name__ == '__main__':

    # 整理数据  数据结构为：
    # [[a1,a2,a3,a4,a5],[b1,b2,b3,b4,b5],[c1,c2,c3,c4,c5]....]
    # a1 表示为1536位的二进制字符串
    result = sortData()

    # 计算海明距离
    total_min_hm_list = computeMinDistance(result)
    result_total = []
    for i in range(0, len(total_min_hm_list), 1):
        for j in range(0, len(total_min_hm_list[i]), 1):
            result_total.append(total_min_hm_list[i][j])

    name = ['dis']
    # for i in range(0, len(total_min_hm_list)-1, 1):
    #     name.append('dis'+str(i))

    result = pd.DataFrame(columns=name, data=result_total)
    result.to_csv('./result.csv', encoding='utf-8')

    # print(total_min_hm_list)
